home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / otm3d095 / 3dtools.h < prev    next >
Encoding:
C/C++ Source or Header  |  1994-12-12  |  5.3 KB  |  300 lines

  1. #ifndef _3DTOOLS_H
  2. #define _3DTOOLS_H
  3.  
  4. #include <math.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include "mode13h.h"
  8. #include "sin.h"
  9.  
  10. #define DIST 1024       // distance between the monitor and the eye, in pixels
  11. #define MAX_XYZ 2097151 // max value in any direction (x, y, z)
  12.  
  13. typedef struct
  14. {
  15.    long localX, localY, localZ;
  16.  
  17. } pointRec;
  18.  
  19. class point3d
  20. {
  21.  
  22. public:
  23.  
  24.     long x3d, y3d, z3d;
  25.     long localX, localY, localZ, rotoX, rotoY, rotoZ;
  26.     long oX, oY, oZ;
  27.     long x2d, y2d;
  28.     long nX, nY, nZ, nCount;
  29.     void *normal;
  30.  
  31.     // I never finished implementing spherical coordinates, feel free to 
  32.     // pick up where I left off ;)
  33.  
  34.     // spherical coordinate implementation -
  35.     // rho   = sqrt(x3d^2 + y3d^2 + z3d^2) = distance
  36.     // phi   = arccos(y3d / rho) = angle of elevation
  37.     // theta = arctan(x3d / z3d) = angle in the XZ plane (yaw)
  38.     // l and g prefixes denote local and global coordinates
  39.     //
  40.     // x = p(sin φ)(cos Θ)
  41.     // y = p(cos φ)
  42.     // z = p(sin φ)(sin Θ)
  43.     //
  44.     // as you can see this is about half the imuls of the conventional method
  45.     // and should also result in SMALLER POINT OBJECTS (just for you, Hurri)
  46.  
  47.     // long lRho, lPhi, lTheta, gRho, gPhi, gTheta;
  48.  
  49.     point3d();
  50.     point3d(long x, long y, long z);
  51.  
  52.     void save(FILE *fp);
  53.     void load(FILE *fp);
  54.  
  55.     void setTo(long x, long y, long z);
  56.  
  57.     void xform2d();
  58.     void display(int color);
  59.     void setNewOrigin(point3d *p);
  60.     void globalXform2origin(point3d *p);
  61.     void copyOrigin(point3d *p);
  62.  
  63.     void localRotate(int dTheta, int dPhi);
  64.     void localRotate(int tX, int tY, int tZ);
  65.     void localRotate(int *trig);
  66.     void globalRotate(int *trig);
  67.  
  68.     void translate(long dX, long dY, long dZ);
  69.     void globalXform();
  70.  
  71.     void zeroNormal();
  72.     void addNormal(int dX, int dY, int dZ);
  73.     void avgNormal();
  74.  
  75.     void matRotate();
  76.  
  77.     ~point3d();
  78.  
  79. private:
  80.  
  81.     long i, j, k;
  82.     int xDeg, yDeg, zDeg;
  83.  
  84.  
  85. };
  86.  
  87. int dotProduct(point3d *p1, point3d *p2);
  88.  
  89.  
  90. class line3d
  91. {
  92.  
  93. public:
  94.  
  95.     line3d(point3d *p1, point3d *p2, int c);
  96.  
  97.     line3d(long x1, long y1, long z1, long x2, long y2, long z2, int c);
  98.  
  99.     void draw();
  100.  
  101.     void calcVectors();
  102.  
  103.     long xOfT(double t);
  104.  
  105.     long yOfT(double t);
  106.  
  107.     long zOfT(double t);
  108.  
  109.     double tOfX(long x);
  110.  
  111.     double tOfY(long y);
  112.  
  113.     double tOfZ(long z);
  114.  
  115.     void localRotate(double tX, double tY, double tZ);
  116.  
  117.     ~line3d();
  118.  
  119. private:
  120.  
  121.     point3d *point1, *point2;
  122.     int color, flag;
  123.     long i, j, k;
  124.  
  125. };
  126.  
  127. typedef struct
  128. {
  129.  
  130.     int p1, p2, p3, normal, color;
  131.  
  132. } polyRec;
  133.  
  134. #define sNone       0
  135. #define sFlat       1
  136. #define sGouraud    2
  137.  
  138. #define fBoth       0
  139. #define fInside     1
  140. #define fOutside    2
  141.  
  142. class polygon
  143. {
  144.  
  145. public:
  146.     point3d *p1, *p2, *p3, *normal;
  147.     int color;
  148.     int facing, shading;
  149.  
  150.     polygon();
  151.  
  152.     polygon(point3d *v1, point3d *v2, point3d *v3, int c);
  153.     polygon(point3d *v1, point3d *v2, point3d *v3, point3d *norm, int c);
  154.  
  155.     void setTo(point3d *v1, point3d *v2, point3d *v3);
  156.  
  157.     long avgZ();
  158.  
  159.     void setColor(int c);
  160.  
  161.     void wireFrame();
  162.     void paintSolid();
  163.     void gShade();
  164.  
  165.     void setNewOrigin(point3d *p);
  166.  
  167.     void localRotate(int *trig);
  168.     void globalRotate(int *trig);
  169.  
  170.     void setGNormals();
  171.  
  172.     void setShading(int shade);
  173.     void setFacing(int face);
  174.     void display();
  175.     void zbFlat();
  176.  
  177.     ~polygon();
  178.  
  179. private:
  180.     line3d **line;
  181.     int count, dot, dot1, dot2, dot3;
  182.  
  183. };
  184.  
  185. typedef struct
  186. {
  187.     char OTMtag[18];
  188.     char newline[1];
  189.     int numPoints, numPolys;
  190.  
  191. } objFileHeader;
  192.  
  193.  
  194. class obj3d
  195. {
  196.  
  197. public:
  198.  
  199.     obj3d(long x, long y, long z);
  200.  
  201.     void save(FILE *fp);
  202.     void load(FILE *fp);
  203.  
  204.     void addLocalPoint(long x, long y, long z);
  205.     void addLocalPoint(point3d *p);
  206.  
  207.     void addGlobalPoint(long x, long y, long z);
  208.     void addGlobalPoint(point3d *p);
  209.  
  210.     void addLocalPoly(polygon *pg);
  211.     void addLocalPoly(int p1, int p2, int p3, int c);
  212.  
  213.     void addGlobalPoly(polygon *pg);
  214.  
  215.     int getPointNum(long x, long y, long z);
  216.     int getPointNum(point3d *p);
  217.  
  218.     void localRotate(int dTheta, int dPhi);
  219.     void localRotate(int tX, int tY, int tZ);
  220.     void globalRotate(int *trig);
  221.  
  222.     void translate(int dX, int dY, int dZ);
  223.  
  224.     void sortPlanes();
  225.  
  226.     void paintDots();
  227.     void wireFrame();
  228.     void paintSolid();
  229.     void gShade();
  230.  
  231.     void setLocation(long x, long y, long z);
  232.  
  233.     void setGNormals();
  234.     void display();
  235.     void zbFlat();
  236.     void addNormal(long x, long y, long z);
  237.     void addNormal(point3d *p);
  238.  
  239.     void matRotate(int tX, int tY, int tZ);
  240.  
  241.     ~obj3d();
  242.  
  243.     point3d  **point;
  244.     point3d  **normal;
  245.     polygon  **poly;
  246.     int numPoints, numNormals, numPolys, count, xDeg, yDeg, zDeg;
  247.  
  248. private:
  249.  
  250.     point3d *origin;
  251.     line3d *xAxis, *yAxis, *zAxis;
  252.     int *trig;
  253.  
  254. };
  255.  
  256. #define MAX_OBJS 128
  257.  
  258. class world3d
  259. {
  260.  
  261. public:
  262.  
  263.     world3d();
  264.  
  265.     void rotate(int tX, int tY, int tZ);
  266.  
  267.     ~world3d();
  268.  
  269. private:
  270.  
  271.     obj3d **object;
  272.     int numObjs;
  273.  
  274. };
  275.  
  276. extern world3d world;
  277.  
  278. class viewPoint
  279. {
  280.  
  281. public:
  282.  
  283.     point3d *location, *light, *view;
  284.  
  285.     viewPoint();
  286.  
  287.     void rotate(int tX, int tY, int tZ);
  288.     void translate(int dX, int dY, int dZ);
  289.  
  290.     ~viewPoint();
  291.  
  292. private:
  293.  
  294.  
  295. };
  296.  
  297. extern viewPoint camera;
  298.  
  299. #endif
  300.